<?php
declare (strict_types=1);

namespace app\job\user;

use app\admin\service\user\UserService;
use app\common\utils\MyLog;
use app\job\BaseJob;
use think\queue\Job;

/**
 * 导出用户数据消息队列:
 * php think queue:work --queue exportUserDataQueue
 */
class UserExportConsumer extends BaseJob
{
    /**
     * fire方法是消息队列默认调用的方法
     * @param Job $job 当前的任务对象
     * @param array $data 发布任务时自定义的数据
     */
    public function fire(Job $job, array $data)
    {
        MyLog::record()->info($data, 'UserExportConsumerData');

        // 有些任务在到达消费者时，可能已经不再需要执行了
        $isJobHasDone = $this->checkIfJobHasDone($data);
        if (!$isJobHasDone) {
            MyLog::record()->info('checkIfJobHasDoneReturnFalse', 'UserExportConsumerResult');
            $job->delete();
            return;
        }

        try {
            //执行具体的业务逻辑
            $result = UserService::getUserList($data['params'], true, true);
            MyLog::record()->info($result, 'UserExportConsumerResult');

            //todo 将导出成功的URL通过 邮箱/企业微信/钉钉 推送给指定人员, 或者更新到某个地方,让指定人员去下载这个URL的文件

            //任务执行成功
            $job->delete();
            echo "任务执行成功,已从队列中删除\n";
        } catch (\Exception $e) {
            //判断任务执行失败的次数,超过一定次数后从队列中删除,防止一直失败占用队列资源
            echo "任务已经执行失败 " . $job->attempts() . "次 \n";
            if ($job->attempts() >= 3) {
                //todo 暂存数据库,等待后续人工介入后手动处理

                //删除队列中的数据
                $job->delete();
                echo "任务已执行失败 " . $job->attempts() . " 次,已暂存数据库,已从队列中删除 \n";
            }
            return;
        }
    }

    /**
     * 有些消息在到达消费者时,可能已经不再需要执行了
     * @param array $data
     * @return bool
     */
    private function checkIfJobHasDone(array $data): bool
    {
        //todo 根据业务需求, 与当时写入队列时的数据校验

        return true;
    }

}
